/**
 * Mapa.java
 * Descripción: Representación de un mapa cuadrado que el robot podrá recorrer.
 * @since 08/11/2012
 * @version 1.0
 * @author Oscar Castañeda, Carnet 11086 
 *         Diego García, Carnet 11360
 *         Luis Carlos Velásquez, Carnet 11085
 *         Sergio Argueta, Carnet 11029
 */

public class Mapa {
    
    private int[][] mapa; //Matriz que contiene al mapa: 1 para obstáculo, 0 camino libre.
    
    /**
     * Crea un nuevo mapa cuadrado.
     * @param size Tamaño de un lado del mapa.
     */
    public Mapa(int size){
        mapa = new int[size+2][size+2];
    }
    
    /**
     * Coloca en la coordenada indicada un valor para indicar que hay en dicho lugar.
     * @param fila Fila del lugar a modificar.
     * @param col Columna del lugar a modificar.
     * @param value Valor a colocar en esta casilla: 0 para espacio libre, 1 para obstáculo.
     * @pre Colocar valores 0 o 1 exclusivamente.
     */
    public void setPlace(int fila, int col, int value){
        mapa[fila+1][col+1] = value;
    }
    
    /**
     * Indica si la posición que está enfrente a la indicada en la dirección también indicada está libre o no.
     * @param fila int con la fila de la posición a checar.
     * @param col int con la columna de la posición de checar.
     * @param dir int con la dirección en la cual se buscará la casilla de enfrente.
     * @return True si la casilla de enfrente está libre, false en caso contrairo.
     */
    public boolean libreEnfrente(int fila, int col, int dir){
        switch (dir){
            case 1:
                return (mapa[fila+1][col+2]==0);
            case 2:
                return (mapa[fila][col+1]==0);
            case 3:
                return (mapa[fila+1][col]==0);
            case 4:
                return (mapa[fila+2][col+1]==0);
            default:
                System.out.println("Error: Caso no esperado.");
                return false;
        }
    }
 
    /**
     * Indica si la posición que está a la derecha a la indicada en la dirección también indicada está libre o no.
     * @param fila int con la fila de la posición a checar.
     * @param col int con la columna de la posición de checar.
     * @param dir int con la dirección en la cual se buscará la casilla de la derecha.
     * @return True si la casilla de la derecha está libre, false en caso contrairo.
     */
    public boolean libreDerecha(int fila, int col, int dir){
        switch (dir){
            case 1:
                return (mapa[fila+2][col+1]==0);
            case 2:
                return (mapa[fila+1][col+2]==0);
            case 3:
                return (mapa[fila][col+1]==0);
            case 4:
                return (mapa[fila+1][col]==0);
            default:
                System.out.println("Error: Caso no esperado.");
                return false;
        }
    }
    
    /**
     * Indica si la posición que está a la izquierda a la indicada en la dirección también indicada está libre o no.
     * @param fila int con la fila de la posición a checar.
     * @param col int con la columna de la posición de checar.
     * @param dir int con la dirección en la cual se buscará la casilla de la izquierda.
     * @return True si la casilla de la izquierda está libre, false en caso contrario.
     */
    public boolean libreIzquierda(int fila, int col, int dir){
        switch (dir){
            case 1:
                return (mapa[fila][col+1]==0);
            case 2:
                return (mapa[fila+1][col]==0);
            case 3:
                return (mapa[fila+2][col+1]==0);
            case 4:
                return (mapa[fila+1][col+2]==0);
            default:
                System.out.println("Error: Caso no esperado.");
                return false;
        }
    }
    
}